// 运行时配置
import { message, notification } from 'antd';

// 错误处理方案： 错误类型
enum ErrorShowType {
  SILENT = 0,
  WARN_MESSAGE = 1,
  ERROR_MESSAGE = 2,
  NOTIFICATION = 3,
  REDIRECT = 9,
}
// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean;
  data: any;
  errorCode?: number;
  errorMessage?: string;
  showType?: ErrorShowType;
}

// 运行时配置
export const request: any = {
  // 统一的请求设定
  timeout: 10000,
  headers: { 'Content-Type': 'application/json' },

  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: (res: ResponseStructure) => {
      const { success, data, errorCode, errorMessage, showType } = res;
      if (!success) {
        const error: any = new Error(errorMessage);
        error.name = 'BizError';
        error.info = { errorCode, errorMessage, showType, data };
        throw error; // 抛出自制的错误
      }
    },
    // 错误接收及处理
    errorHandler: (error: any, opts: any) => {
      if (opts?.skipErrorHandler) throw error;
      // 我们的 errorThrower 抛出的错误。
      if (error.name === 'BizError') {
        const errorInfo: ResponseStructure | undefined = error.info;
        if (errorInfo) {
          const { errorMessage, errorCode } = errorInfo;
          switch (errorInfo.showType) {
            case ErrorShowType.SILENT:
              // do nothing
              break;
            case ErrorShowType.WARN_MESSAGE:
              (message as any).warn(errorMessage);
              break;
            case ErrorShowType.ERROR_MESSAGE:
              message.error(errorMessage);
              break;
            case ErrorShowType.NOTIFICATION:
              notification.open({
                description: errorMessage,
                message: errorCode,
              });
              break;
            case ErrorShowType.REDIRECT:
              // TODO: redirect
              break;
            default:
              message.error(errorMessage);
          }
        }
      } else if (error.response) {
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        message.error(`Response status:${error.response.status}`);
      } else if (error.request) {
        // 请求已经成功发起，但没有收到响应
        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        message.error('None response! Please retry.');
      } else {
        // 发送请求时出了点问题
        // message.error('Request error, please retry.');
        message.error(error.message);
      }
    },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: any) => {
      // 拦截请求配置，进行个性化处理。
      config.headers.token = localStorage.getItem('token');
      return config;
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response: any) => {
      console.log(response);

      // 拦截响应数据，进行个性化处理
      const { data } = response;
      if (data.code !== '200') {
        // message.error(data.message);
        return Promise.reject(data);
      } else {
        return response;
      }
      // return response;
    },
  ],
};

// 全局初始化数据配置，用于 Layout 用户信息和权限初始化
// 更多信息见文档：https://umijs.org/docs/api/runtime-config#getinitialstate
export async function getInitialState(): Promise<{ name: string }> {
  return { name: '@umijs/max' };
}

export const layout = () => {
  return {
    logo: 'https://img.alicdn.com/tfs/TB1YHEpwUT1gK0jSZFhXXaAtVXa-28-27.svg',
    menu: {
      locale: false,
    },
  };
};

// 动态地修改路由，比如增加、删除路由，或者修改路由属性
// 只有在项目初始化的时候可以执行
export function patchClientRoutes({ routes }: any) {
  console.log(routes);

  // routes[1].routes.push({
  //   name: '系统首页',
  //   path: '/home',
  //   element: <Home />,
  // });

  // routes[1].routes.push({
  //   name: '轮播图管理',
  //   path: '/banner',
  //   children: [
  //     {
  //       name: '轮播图列表',
  //       path: '/banner/list',
  //       element: <BannerList />,
  //     },
  //   ],
  // });

  // routes[1].routes.unshift({
  //   name: 'abc',
  //   path: '/abc',
  //   element: <div>abc</div>,
  // });
}

export function render(oldRender: () => void) {
  console.log('render');

  oldRender();
}
